﻿#define  _CRT_SECURE_NO_WARNINGS  1
#include<iostream>
using namespace std;

//class Person
//{
//public:
//	void Print()
//	{
//		cout << _name << endl;
//
//		//简介访问"私房钱"
//		cout << _age << endl;
//	}
//protected:
//	string _name="小王"; // 姓名 
//private:
//	int _age=18; // 年龄 
//};
////class Student : protected Person
////class Student : private Person
//class Student : public Person
//{
//public:
//
//	void func()
//	{
//		cout << _name << endl;
//		// 不可见
//		//cout << _age << endl;
//		Print();
//	}
//protected:
//	int _stunum=2023; // 学号 
//};
//
//int main()
//{
//	Student s;
//	//s.Print();
//	s.Print();
//	s.func();
//	//s._name;
//	Person p;
//	
//	return 0;
//}



//class Person
//{
//protected:
//	string _name = "张三"; // 姓
//	int _id = 1;
//};
//
//class Student : public Person
//{
//public:
//	void func()
//	{
//		cout << _id << endl;
//	}
//protected:
//	int _stunum = 1; // 学号
//	int _id = 2;
//};
//int main()
//{
//	Student s;
//	//派生类对象可以赋值给基类的引用或者指针
//	Person* ps = &s;
//	Person& ref = s;
//
//	//基类对象不能直接赋值给派生类对象
//	//Person p;
//	//s = p;
//
//	return 0;
//}

//class Person
//{
//protected:
//	string _name = "张三";
//	int _num= 101;
//};
//
//class Student :public Person
//{
//public:
//	void Print()
//	{
//		cout << " 姓名:" << _name << endl;
//		//基类对同名成员的间接访问
//		cout << " ⾝份证号:" << Person::_num << endl;
//
//		//隐藏:派生类和基类有同名成员,派生类成员将屏蔽基类对同名成员的直接访问
//		cout << " 学号:" << _num << endl;
//	}
//
//protected:
//	int _num = 909;
//};
//int main()
//{
//	Student s1;
//	s1.Print();
//	return 0;
//}


//class A
//{
//public:
//	void func()
//	{
//		cout << "func()" << endl;
//	}
//};
//
//class B :public A
//{
//public:
//	void func(int i)
//	{
//		cout << "func(int i)" << endl;
//	}
//};
//int main()
//{
//	B b;
//	b.func(10);
//	b.A::func();
//	return 0;
//}


//A和B类中的两个func构成什么关系 构成隐藏
//下⾯程序的编译运⾏结果是什么 编译报错
//class A
//{
//public:
//	void fun()
//	{
//		cout << "func()" << endl;
//	}
//};
//class B : public A
//{
//public:
//	void fun(int i)
//	{
//		cout << "func(int i)" << i << endl;
//	}
//};
//int main()
//{
//	B b;
//	b.fun(10);
//	b.fun();
//
//	return 0;
//};


//派生类的默认成员函数
//class Person
//{
//public:
//	Person(const char* name = "peter")
//		: _name(name)
//	{
//		 cout << "Person()" << endl;
//	}
//
//	Person(const Person& p)
//		: _name(p._name)
//	{
//		cout << "Person(const Person& p)" << endl;
//	}
//
//	Person& operator=(const Person& p)
//	{
//		cout << "Person operator=(const Person& p)" << endl;
//		if (this != &p)
//			_name = p._name;
//
//		return *this;
//	}
//
//	~Person()
//	{
//		cout << "~Person()" << endl;
//	}
//protected:
//	string _name; // 姓名 
//};
//class Student :public Person
//{
//public:
//	Student(const char* name="张三", int num=10)
//		//类似匿名对象的方式
//		:Person(name)
//		//:_name(name) err
//		,_num(num)
//	{
//		cout << "Student()" << endl;
//	}
//	
	//s2(s1)
	//Student(const Student& s)

	//Person(const Person& p)
	//	: _name(p._name)
	//{
	//	cout << "Person(const Person& p)" << endl;
	//}
		//派生类可以直接赋值给基类的引用或者指针
//		:Person(s)
//		,_num(s._num)
//	{
//		cout << "Student(Student& s)" << endl;
//	}
//
//	//s1 = s3;
//	Student& operator=(const Student& s)
//	{
//		if (this != &s)
//		{
//			Person::operator=(s);
//			_num = s._num;
//		}
//		return *this;
//	}
//
//	~Student()
//	{
//		//~Person(); //隐藏---
//		//Person::~Person();
//		delete[]_ptr;
//		cout << "~Student()" << endl;
//	}
//protected:
//	int _num;
//	int* _ptr = new int[10];
//};
//int main()
//{
//	//Student s;
//	Student s1("jack", 18);
//	//Student s2(s1);
//
//	//Student s3("小王", 20);
//	//s1 = s3;
//	return 0;
//}


//class  Person
//{
//protected:
//	string _name;
//};
//class Student :public Person
//{
//public:
//	void func()
//	{
//		cout << _name << endl;
//	}
//protected:
//	int _num;
//};
//
//int main()
//{
//	Student s;
//	s.func();
//	Person p;
//	p._name;
//	return 0;
//}


//实现一个不能被继承的类
//C++11 final final修改基类,派生类就不能被继承了

//class Base final
//{
//public:
//	void func5() { cout << "Base::func5" << endl; }
//protected:
//	int a = 1;
//};
//
//class Base 
//{
//public:
//	void func5() { cout << "Base::func5" << endl; }
//protected:
//	int a = 1;
//private:
//		 //C++98的⽅法 
//    Base()
//	{}
//};
//class Derive :public Base
//{
//public:
//	void func4() { cout << "Derive::func4" << endl; }
//protected:
//	int b = 2;
//};
//int main()
//{
//	//Base b;
//	Derive d;
//	return 0;
//}


//前置声明,编译器只会向上查找变量等名字
//class Student;
//
//
//class Person
//{
//public:
//	friend void Display(const Person& p, const Student& s);
//protected:
//	string _name="小王"; // 姓名 
//};
//
//class Student : public Person
//{
//public:
//	friend void Display(const Person& p, const Student& s);
//protected:
//	int _stuNum=205; // 学号 
//};
//
//  void Display(const Person& p, const Student& s)
//  {
//	  cout << p._name << endl;
//	  cout << s._stuNum << endl;
//  }
//
//int main()
//{
//	Person  p;
//	Student s;
//	Display(p, s);
//
//	return 0;
//}



//class Person
//{
//public:
//	friend void Display(const Person& p);
//protected:
//	string _name="张三"; // 姓名 
//};
//void Display(const Person& p)
//{
//	cout << p._name << endl;
//}
//
//int main()
//{
//	Person p;
//	Display(p);
//	return 0;
//}


//class Person
//{
//public:
//	string _name;
//	static int _count;
//};
//
//int Person::_count = 0;
//
//class Student :public Person
//{
//protected:
//	int _stuNum;
//};
//
//int main()
//{
//	Person p;
//	Student s;
//	cout << &p._name << endl;
//	cout << &s._name << endl;
//
//	cout << &p._count << endl;
//	cout << &s._count << endl;
//     
//	cout << &Person::_count << endl;
//	cout << &Student::_count << endl;
//	return 0;
//}



//class Person
//{
//public:
//     string _name="xiaowang"; // 姓名 
//};
//class Student : public Person
//{
//protected:
//	int _num=10; //学号 
//};
//class Teacher : public Person
//{
//protected:
//	int _id=223; // 职⼯编号 
//};
//class Assistant :public Student, public Teacher
//{
//protected:
//	string _majorCourse="高等数学"; // 主修课程 
//};
//
//int main()
//{
//	Assistant aa1;
//
//	//对“_name”的访问不明确 err
//	//aa1._name;
//
//	cout << aa1.Student::_name<<endl; 
//	cout<<aa1.Teacher::_name<<endl;
//	return 0;
//}


//class Person
//{
//public:
//	Person(const char* name)
//		:_name(name)
//	{}
//	string _name; // 姓名
//};
//class Student : virtual public Person
//{
//public:
//	Student(const char* name, int num)
//		:Person(name)//编译器不会走这个Person
//		, _num(num)
//	{}
//protected:
//	int _num; //学号
//};
//class Teacher : virtual public Person
//{
//public:
//	Teacher(const char* name, int id)
//		:Person(name)//编译器不会走这个Person
//		, _id(id)
//	{}
//protected:
//	int _id; // 职⼯编号
//};
//// 不要去玩菱形继承
//class Assistant : public Student, public Teacher
//{
//public:
//	Assistant(const char* name1, const char* name2, const char* name3)
//		:Person(name3)
//		, Student(name1, 1)
//		, Teacher(name2, 2)
//	{}
//protected:
//	string _majorCourse; // 主修课程
//};
//int main()
//{
//	// 思考⼀下这⾥a对象中_name是"张三", "李四", "王五"中的哪⼀个？
//	Assistant a("张三", "李四", "王五");
//
//	Teacher t("小王",226);
//	return 0;
//}


class Base1 { public: int _b1; };
class Base2 { public: int _b2; };
class Derive : public Base1, public Base2 { public: int _d; };
	int main()
	{
		Derive d;
		Base1* p1 = &d;
		Base2* p2 = &d;
		Derive* p3 = &d;

		cout << p1 <<'\n' << p2<<'\n' << p3 << endl;
		 return 0;
	}
